# coding:utf-8
import base64
import binascii

from Crypto.Cipher import AES, DES
from Crypto.Util.Padding import pad, unpad


class KeyUtils:
    SECRET_KEY = "qCnN7FgsDuU="

    @staticmethod
    def _get_key():
        # 解码 BASE64 密钥
        return base64.b64decode(KeyUtils.SECRET_KEY)

    @staticmethod
    def encrypt(info: str) -> str:
        """
        加密函数
        :param info: 需要加密的明文
        :return: 加密后的密文（十六进制字符串）
        """
        if not info:
            return ''
        key = KeyUtils._get_key()
        des = DES.new(key, DES.MODE_ECB)
        # 使用 DES 加密并返回十六进制字符串
        encrypted = des.encrypt(pad(info.encode(), DES.block_size))
        return encrypted.hex()

    @staticmethod
    def decode(encrypt: str) -> str:
        """
        解密函数
        :param encrypt: 需要解密的密文（十六进制字符串）
        :return: 解密后的明文
        """
        if not encrypt:
            return ''
        key = KeyUtils._get_key()
        des = DES.new(key, DES.MODE_ECB)
        # 使用 DES 解密并移除填充
        decrypted = unpad(des.decrypt(bytes.fromhex(encrypt)), DES.block_size)
        return decrypted.decode()


def encryption(secret: str, text: str) -> str:
    """
    AES的ECB模式加密方法
    :param secret: 密钥
    :param text:被加密字符串（明文）
    :return:密文
    """
    secret = secret.encode('utf8')
    # 创建AES加密对象
    cipher = AES.new(secret, AES.MODE_ECB)

    # 字符串补位
    if isinstance(text, str):
        text = text.encode('utf-8')

    text = pad(text, AES.block_size)

    # 加密后得到的是bytes类型的数据，使用Base64进行编码,返回byte字符串
    encrypted_text: bytes = cipher.encrypt(text)
    return base64.b64encode(encrypted_text).decode('utf8')


def decryption(secret: str, encrypted_text: str) -> tuple:
    """
    :param secret: 密钥
    :param encrypted_text: 加密后的数据（密文）
    :return:明文
    """
    try:
        secret = secret.encode('utf8')
        encrypted_text = base64.b64decode(encrypted_text)

        # 创建解密对象
        cipher = AES.new(secret, AES.MODE_ECB)

        # 去补位
        text_decrypted = unpad(cipher.decrypt(encrypted_text), AES.block_size).decode('utf8')
    except binascii.Error as e:
        return False, e.args[0]
    except Exception as e:
        return False, e.args[0]

    if not text_decrypted:
        return False, '秘钥不正确'

    return True, text_decrypted